#pragma once

#include <string>
#include <vector>
#include <xdb_bench.h>
#include <xdb_search.h>
#include <unordered_map>
#include <memory>
#include <iostream>
#include <system_error>
#include <sstream>

namespace Util
{
    enum class parse_erroc
    {
        success = 0, // 解析成功
        failed,      // 解析失败
        un_init,     // xdbPtr未初始化
        is_ipv6,     // ipv6地址，暂时没解析
    };

    auto &parseErrorCategory();

    struct ParseResult
    {
        parse_erroc ec;
        std::string location;

        operator bool()
        {
            return ec == parse_erroc::success;
        }
    };

    std::error_code make_error_code(parse_erroc ec);

    /// @brief ip2region 工具类
    class Ip2RegionUtil
    {
    public:
        
        /// @brief 使用xdb文件初始化ip2region工具类，不初始化会报错
        /// @param xdbFilePath 
        /// @return 初始化是否成功
        static bool init(const std::string &xdbFilePath);
        
        /// @brief 将ip转换为对应的location
        /// @param ip 
        /// @return 
        static ParseResult getIpLocation(const std::string &ip);

    private:
        /// @brief 将ip2region转换后的结果转换为用 "-" 链接的ip地址所在地
        /// @param input ip2region将ip地址转换后的结果，如：中国|0|北京|北京市|联通
        /// @return 如果成功返回 "-" 链接的形式
        static ParseResult parseLocation(const std::string &input);

        static std::shared_ptr<xdb_search_t> xdbPtr;
    };
}